//package com.rxyb.toolize;
//
//import java.time.DayOfWeek;
//import java.time.LocalDate;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.time.temporal.ChronoUnit;
//import java.time.temporal.Temporal;
//import java.time.temporal.TemporalAdjusters;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.stream.Stream;
//
///**
// * JDK8 的应用，可以使用 Instant 代替 Date，
// * LocalDateTime 代替 Calendar，
// * DateTimeFormatter 代替 Simpledateformatter，
// *
// * @coder duyh,@auth duyh
// * @date May 13, 2020
// */
//public class DateTime {
//
//    public static final String FORMAT_YEAR = "yyyy";
//
//    public static final String FORMAT_MONTH_LONG = "yyyyMM";
//    public static final String FORMAT_MONTH_STR = "yyyy-MM";
//    public static final String FORMAT_MONTH_CHINESE = "yyyy年MM月";
//
//    public static final String FORMAT_DATE_LONG = "yyyyMMdd";
//    public static final String FORMAT_DATE_STR = "yyyy-MM-dd";
//    public static final String FORMAT_DATE_CHINESE = "yyyy年MM月dd日";
//
//    public static final String FORMAT_TIME_LONG = "yyyyMMddHHmmss";
//    public static final String FORMAT_TIME_STR = "yyyy-MM-dd HH:mm:ss";
//    public static final String FORMAT_TIME_CHINESE = "yyyy年MM月dd日 HH:mm:ss";
//
//    /**
//     * 获取当前时间
//     *
//     * @return yyyyMMddHHmmss
//     */
//    public static Long getNowLong() {
//        return parseTimeToLong(LocalDateTime.now());
//    }
//
//    /**
//     * 获取当前时间
//     *
//     * @return yyyy-MM-dd HH:mm:ss
//     */
//    public static String getNowStr() {
//        return parseTimeToString(LocalDateTime.now(), FORMAT_TIME_STR);
//    }
//
//    /**
//     * 获取当前时间
//     *
//     * @return yyyy年MM月dd日 HH:mm:ss
//     */
//    public static String getNowChinese() {
//        return parseTimeToString(LocalDateTime.now(), FORMAT_TIME_CHINESE);
//    }
//
//    /**
//     * 获取当前日期
//     *
//     * @return yyyyMMdd
//     */
//    public static Long getTodayLong() {
//        return parseDateToLong(LocalDate.now(), FORMAT_DATE_LONG);
//    }
//
//    /**
//     * 获取当前日期
//     *
//     * @return yyyy-MM-dd
//     */
//    public static String getTodayStr() {
//        return parseDateToString(LocalDate.now(), FORMAT_DATE_STR);
//    }
//
//    /**
//     * 获取当前日期
//     *
//     * @return yyyy年MM月dd日
//     */
//    public static String getTodayChinese() {
//        return parseDateToString(LocalDate.now(), FORMAT_DATE_CHINESE);
//    }
//
//    /**
//     * 获取当前月
//     *
//     * @return yyyyMM
//     */
//    public static Long getMonthLong() {
//        return parseDateToLong(LocalDate.now(), FORMAT_MONTH_LONG);
//    }
//
//    /**
//     * 获取当前月
//     *
//     * @return yyyy-MM
//     */
//    public static String getMonthStr() {
//        return parseDateToString(LocalDate.now(), FORMAT_MONTH_STR);
//    }
//
//    /**
//     * 获取当前月
//     *
//     * @return yyyy年MM月
//     */
//    public static String getMonthChinese() {
//        return parseDateToString(LocalDate.now(), FORMAT_MONTH_CHINESE);
//    }
//
//    /**
//     * 获取当前年
//     *
//     * @return yyyy
//     */
//    public static Long getYearLong() {
//        return parseDateToLong(LocalDate.now(), FORMAT_YEAR);
//    }
//
//    /**
//     * 获取当前日期的偏移量-天
//     *
//     * @param days
//     * @return
//     */
//    public static Long dayPlusDay(int days) {
//        return parseDateToLong(LocalDate.now().plusDays(days), FORMAT_DATE_LONG);
//    }
//
//    /**
//     * 获取某个日期的偏移量-天
//     *
//     * @param days
//     * @return
//     */
//    public static Long dayPlusDay(Long date, int days) {
//        return parseDateToLong(parseLongToDate(date).plusDays(days), FORMAT_DATE_LONG);
//    }
//
//    /**
//     * 获取当前日期的偏移量-月
//     *
//     * @param months
//     * @return
//     */
//    public static Long dayPlusMonth(int months) {
//        return parseDateToLong(LocalDate.now().plusMonths(months), FORMAT_DATE_LONG);
//    }
//
//    /**
//     * 获取当前日期的偏移量-月
//     *
//     * @param months
//     * @return
//     */
//    public static Long dayPlusMonth(Long date, int months) {
//        return parseDateToLong(parseLongToDate(date).plusMonths(months), FORMAT_DATE_LONG);
//    }
//
//    /**
//     * 获取当前日期的偏移量-年
//     *
//     * @param years
//     * @return
//     */
//    public static Long dayPlusYear(int years) {
//        return parseDateToLong(LocalDate.now().plusYears(years), FORMAT_DATE_LONG);
//    }
//
//    /**
//     * 获取当前日期的偏移量-年
//     *
//     * @param years
//     * @return
//     */
//    public static Long dayPlusYear(Long date, int years) {
//        return parseDateToLong(parseLongToDate(date).plusYears(years), FORMAT_DATE_LONG);
//    }
//
//    /**
//     * 获取当前时间的偏移量-小时
//     *
//     * @param hours
//     * @return
//     */
//    public static Long timePlusHours(int hours) {
//        return parseTimeToLong(LocalDateTime.now().plusHours(hours));
//    }
//
//    /**
//     * 获取当前时间的偏移量-小时
//     *
//     * @param dateLong
//     * @param hours
//     * @return
//     */
//    public static Long timePlusHours(Long dateLong, int hours) {
//        return parseTimeToLong(parseLongToTime(dateLong).plusHours(hours));
//    }
//
//    /**
//     * 获取当前时间的偏移量-分钟
//     *
//     * @param minutes
//     * @return
//     */
//    public static Long timePlusMinutes(int minutes) {
//        return parseTimeToLong(LocalDateTime.now().plusMinutes(minutes));
//    }
//
//    /**
//     * 获取当前时间的偏移量-分钟
//     *
//     * @param dateLong
//     * @param minutes
//     * @return
//     */
//    public static Long timePlusMinutes(Long dateLong, int minutes) {
//        return parseTimeToLong(parseLongToTime(dateLong).plusMinutes(minutes));
//    }
//
//    /**
//     * 获取当前月的第一天
//     *
//     * @param date
//     * @return
//     */
//    public static Long getFirstDayOfMonth(Long date) {
//        if (null == date) {
//            return null;
//        }
//        LocalDate startDate = parseLongToDate(date);
//        return parseDateToLong(startDate.with(TemporalAdjusters.firstDayOfMonth()), FORMAT_DATE_LONG);
//    }
//
//    /**
//     * 获取当前月的最后一天
//     *
//     * @param date
//     * @return
//     */
//    public static Long getLastDayOfMonth(Long date) {
//        if (null == date) {
//            return null;
//        }
//        LocalDate startDate = parseLongToDate(date);
//        return parseDateToLong(startDate.with(TemporalAdjusters.lastDayOfMonth()), FORMAT_DATE_LONG);
//    }
//
//    /**
//     * 获取某日期的周表达名称
//     *
//     * @param date
//     * @return
//     */
//    public static String getDayOfWeekChinese(Long date) {
//        if (null == date) {
//            return null;
//        }
//        DayOfWeek dayOfWeek = parseLongToDate(date).getDayOfWeek();
//        if (dayOfWeek.getValue() == 1) {
//            return "星期一";
//        } else if (dayOfWeek.getValue() == 2) {
//            return "星期二";
//        } else if (dayOfWeek.getValue() == 3) {
//            return "星期三";
//        } else if (dayOfWeek.getValue() == 4) {
//            return "星期四";
//        } else if (dayOfWeek.getValue() == 5) {
//            return "星期五";
//        } else if (dayOfWeek.getValue() == 6) {
//            return "星期六";
//        }
//        return "星期日";
//    }
//
//    /**
//     * 获取某日期的周表达数字
//     *
//     * @param date
//     * @return
//     */
//    public static int getDayOfWeekForInt(Long date) {
//        if (null == date) {
//            return 0;
//        }
//        return parseLongToDate(date).getDayOfWeek().getValue();
//    }
//
//    /**
//     * 时间差值，
//     * betweenDIF(20150406L, 20150407L, ChronoUnit.DAYS)
//     * 参数的时间格式需要一致
//     * yyyyMMdd只能计算单位年、月、日、周
//     * yyyyMMddHHmmss才可以时、分、秒
//     *
//     * @param sta
//     * @param end
//     * @param unit 单位
//     * @return
//     */
//    public static Long betweenDIF(Long sta, Long end, ChronoUnit unit) {
//        return unit.between(parseLongToTemporal(sta), parseLongToTemporal(end));
//    }
//
//    /**
//     * 获取两个日期间的所有日期
//     *
//     * @param start
//     * @param end
//     * @return
//     */
//    public static List<String> getBetweenDate(String start, String end) {
//        List<String> list = new ArrayList<String>();
//        LocalDate startDate = LocalDate.parse(start, DateTimeFormatter.ofPattern("yyyyMMdd"));
//        LocalDate endDate = LocalDate.parse(end, DateTimeFormatter.ofPattern("yyyyMMdd"));
//        long distance = ChronoUnit.DAYS.between(startDate, endDate);
//        if (distance < 1) {
//            return list;
//        }
//        Stream.iterate(startDate, d -> {
//            return d.plusDays(1);
//        }).limit(distance + 1).forEach(f -> {
//            list.add(f.format(DateTimeFormatter.ofPattern("yyyyMMdd")));
//        });
//        return list;
//    }
//
//    /**
//     * 将数字类型日期改为日期类型
//     *
//     * @param date
//     * @return pattern
//     */
//    public static String parseLongToString(Long date, String pattern) {
//        if (null == date) {
//            return null;
//        }
//        try {
//            if (FORMAT_TIME_STR.equals(pattern) || FORMAT_TIME_CHINESE.equals(pattern)) {
//                LocalDateTime time = LocalDateTime.parse(date.toString(), DateTimeFormatter.ofPattern(FORMAT_TIME_LONG));
//                return parseTimeToString(time, pattern);
//            } else if (FORMAT_DATE_STR.equals(pattern) || FORMAT_DATE_CHINESE.equals(pattern)) {
//                LocalDate time = LocalDate.parse(date.toString(), DateTimeFormatter.ofPattern(FORMAT_DATE_LONG));
//                return parseDateToString(time, pattern);
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//    /**
//     * 将字符串日期改为数字型日期字符串
//     *
//     * @param date yyyy-MM-dd HH:mm:ss[yyyyMMddHHmmss]
//     * @return yyyyMMddHHmmss[yyyyMMdd]
//     */
//    public static Long parseStringToLong(String date) {
//        if (VO.isBlank(date)) {
//            return null;
//        }
//        try {
//            if (date.length() == 14 || date.indexOf(":") > 0) {
//                String pattern = FORMAT_TIME_LONG;
//                if (date.indexOf("-") > 0) {
//                    pattern = FORMAT_TIME_STR;
//                } else if (date.indexOf("年") > 0) {
//                    pattern = FORMAT_TIME_CHINESE;
//                }
//                LocalDateTime time = LocalDateTime.parse(date.toString(), DateTimeFormatter.ofPattern(pattern));
//                return parseTimeToLong(time);
//            } else {
//                String pattern = FORMAT_DATE_LONG;
//                if (date.indexOf("-") > 0) {
//                    pattern = FORMAT_DATE_STR;
//                } else if (date.indexOf("年") > 0) {
//                    pattern = FORMAT_DATE_CHINESE;
//                }
//                LocalDate time = LocalDate.parse(date.toString(), DateTimeFormatter.ofPattern(pattern));
//                return parseDateToLong(time, FORMAT_DATE_LONG);
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//    private static LocalDate parseLongToDate(Long date) {
//        return LocalDate.parse(String.valueOf(date), DateTimeFormatter.ofPattern(FORMAT_DATE_LONG));
//    }
//
//    private static LocalDateTime parseLongToTime(Long time) {
//        return LocalDateTime.parse(String.valueOf(time), DateTimeFormatter.ofPattern(FORMAT_TIME_LONG));
//    }
//
//    private static Long parseTimeToLong(LocalDateTime time) {
//        return Long.parseLong(time.format(DateTimeFormatter.ofPattern(FORMAT_TIME_LONG)));
//    }
//
//    private static String parseTimeToString(LocalDateTime time, String format) {
//        return time.format(DateTimeFormatter.ofPattern(format));
//    }
//
//    private static Long parseDateToLong(LocalDate date, String format) {
//        return Long.parseLong(date.format(DateTimeFormatter.ofPattern(format)));
//    }
//
//    private static String parseDateToString(LocalDate date, String format) {
//        return date.format(DateTimeFormatter.ofPattern(format));
//    }
//
//    private static Temporal parseLongToTemporal(Long num) {
//        if (9999999999999L < num && num < 99999999999999L)
//            return LocalDateTime.parse(num.toString(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
//        if (9999999L < num && num < 99999999L)
//            return LocalDate.parse(num.toString(), DateTimeFormatter.ofPattern("yyyyMMdd"));
//        return null;
//    }
//
//    public static void main(String[] args) {
//        Long dateA = 20200101L;
//        Long dateB = 20200112L;
//        String dateC = "2020-05-13";
//        String dateD = "2020年05月13日";
//        Long timeA = 20200101010000L;
//        Long timeB = 20200112120000L;
//        String timeC = "2020-05-13 18:34:22";
//        String timeD = "2020年05月13日 18:34:22";
//
//        System.out.println("获取【当前时间】的数字格式：" + DateTime.getNowLong());
//        System.out.println("获取【当前时间】的日期格式：" + DateTime.getNowStr());
//        System.out.println("获取【当前时间】的中文格式：" + DateTime.getNowChinese());
//        System.out.println("获取【当前日期】的数字格式：" + DateTime.getTodayLong());
//        System.out.println("获取【当前日期】的日期格式：" + DateTime.getTodayStr());
//        System.out.println("获取【当前日期】的中文格式：" + DateTime.getTodayChinese());
//        System.out.println("获取【当前月份】的数字格式：" + DateTime.getMonthLong());
//        System.out.println("获取【当前月份】的日期格式：" + DateTime.getMonthStr());
//        System.out.println("获取【当前月份】的中文格式：" + DateTime.getMonthChinese());
//        System.out.println("获取【当前年份】的数字格式：" + DateTime.getYearLong());
//        System.out.println("获取【当前日期】的日偏移+1：" + DateTime.dayPlusDay(1));
//        System.out.println("获取【" + dateA + "】的日偏移+1：" + DateTime.dayPlusDay(dateA, 1));
//        System.out.println("获取【当前日期】的月偏移：" + DateTime.dayPlusMonth(1));
//        System.out.println("获取【" + dateA + "】的月偏移+1：" + DateTime.dayPlusMonth(dateA, 1));
//        System.out.println("获取【当前日期】的年偏移+1：" + DateTime.dayPlusYear(1));
//        System.out.println("获取【" + dateA + "】的年偏移+1：" + DateTime.dayPlusYear(dateA, 1));
//        System.out.println("获取【当前时间】的时偏移+1：" + DateTime.timePlusHours(1));
//        System.out.println("获取【" + timeA + "】的时偏移+1：" + DateTime.timePlusHours(timeA, 1));
//        System.out.println("获取【当前时间】的分偏移+1：" + DateTime.timePlusMinutes(1));
//        System.out.println("获取【" + timeA + "】的分偏移+1：" + DateTime.timePlusMinutes(timeA, 1));
//        System.out.println("获取【" + dateB + "】的月第一天：" + DateTime.getFirstDayOfMonth(dateB));
//        System.out.println("获取【" + dateB + "】的月最后一天：" + DateTime.getLastDayOfMonth(dateB));
//        System.out.println("获取【" + dateB + "】的周名称：" + DateTime.getDayOfWeekChinese(dateB));
//        System.out.println("获取【" + dateB + "】的周数字：" + DateTime.getDayOfWeekForInt(dateB));
//        System.out.println("计算【" + dateA + "】与【" + dateB + "】的月差值：" + DateTime.betweenDIF(dateA, dateB, ChronoUnit.MONTHS));
//        System.out.println("计算【" + dateA + "】与【" + dateB + "】的日差值：" + DateTime.betweenDIF(dateA, dateB, ChronoUnit.DAYS));
//        System.out.println("计算【" + timeA + "】与【" + timeB + "】的时差值：" + DateTime.betweenDIF(timeA, timeB, ChronoUnit.HOURS));
//        System.out.println("计算【" + timeA + "】与【" + timeB + "】的分差值：" + DateTime.betweenDIF(timeA, timeB, ChronoUnit.MINUTES));
//        System.out.println("计算【" + timeA + "】与【" + timeB + "】的秒差值：" + DateTime.betweenDIF(timeA, timeB, ChronoUnit.SECONDS));
//        System.out.println("将数字类型时间【" + timeB + "】改为日期类型：" + DateTime.parseLongToString(timeB, DateTime.FORMAT_TIME_STR));
//        System.out.println("将数字类型时间【" + timeB + "】改为中文类型：" + DateTime.parseLongToString(timeB, DateTime.FORMAT_TIME_CHINESE));
//        System.out.println("将数字类型日期【" + dateB + "】改为日期类型：" + DateTime.parseLongToString(dateB, DateTime.FORMAT_DATE_STR));
//        System.out.println("将数字类型日期【" + dateB + "】改为中文类型：" + DateTime.parseLongToString(dateB, DateTime.FORMAT_DATE_CHINESE));
//        System.out.println("将字符串日期【" + dateC + "】改为数字型日期字符串：" + DateTime.parseStringToLong(dateC));
//        System.out.println("将字符串日期【" + dateD + "】改为数字型日期字符串：" + DateTime.parseStringToLong(dateD));
//        System.out.println("将字符串日期【" + timeC + "】改为数字型日期字符串：" + DateTime.parseStringToLong(timeC));
//        System.out.println("将字符串日期【" + timeD + "】改为数字型日期字符串：" + DateTime.parseStringToLong(timeD));
//    }
//}
